; The code will start executing at the first instruction. Technically you do not
;   need to label the "Init", but is a nice convention to think of it as a
;   procedure.
; 该代码将从第一条指令开始执行。 从技术上讲，您无需标记“ Init”，但是将其视为一个过程是一种很好的约定。

Init:
  mov $3, %c1               ; 将数字3保存到寄存器C1中

  push %c1                  ; 将寄存器C1值入栈顶
  call :Multiply_by_five    ; 跳转到Multiply_by_five处执行
  add $4, %stk              ; remove c1 from stack 将栈顶和数字4相加

  halt                      ; Needed for graceful shutdown 终止程序运行


Multiply_by_five:
  push %bse                 ; Stack set up 将基址寄存器入栈顶
  mov %stk, %bse            ; 将栈指针值赋值给基址寄存器

  mov *(%bse+$8), %ret      ; 将基址寄存器加上偏移量8,赋值给ret寄存器

  mul $5,%ret               ; 将ret寄存器值与数字5相乘

  pop %bse                  ; Stack tear down 将基址寄存器出栈
  ret                       ; 返回


; 提出几个问题
; 机器码是如何与指令对应起来的
; 调用call指令是不是会改变stk栈寄存器值
; mul指令结果保存在哪里
; add指令会不会修改stk栈寄存器值